#迭代器协议
#迭代器对象是实现了迭代器协议的对象。
'''
概念：对象必须提供一个next方法，执行该方法要么返回迭代
中的下一项，要么就引起一个StopIteration的异常来终止迭代。
（只能往后走，不能往前退）
'''
#条件：
'''
1.对象实现了__next__()方法
2.__next__()方法反回了某个数值，并且按照一定的顺序进行依次返回
3.__next__()方法取完值后，抛出异常。
'''

#协议及应用场景：遍历很大的数据集合，节省内存，不依赖索引取值，实现惰性计算。

#用类实现迭代器功能
#例子：
class Person:
    def __init__(self):
        self.n = 1

    def funa(self):   #计数器的功能
        self.n += 1
        return self.n

a = Person()   #实例化对象a
print(a.funa()) #2
print(a.funa()) #3
print(a.funa()) #4

#判断a是否是迭代器或迭代对象
from collections.abc import Iterator,Iterable
print(isinstance(a,Iterator))  #False 表明a不是迭代器
print(isinstance(a,Iterable))  #False 表明a不是迭代对象
print('\n')

#==================================================================================
#修改成迭代器
class Person:
    def __iter__(self):
        self.n = 1
        return self

    def __next__(self):   #计数器的功能
        self.n += 1
        return self.n

a = Person()    #实例化对象a
my = iter(a)    #my为迭代器对象
print(my)       #打印迭代器对象地址 <__main__.Person object at 0x000001D2A3B4F450>
print(next(my)) #2
print(next(my)) #3
print(next(my)) #4

#判断a是否是迭代器或迭代对象
from collections.abc import Iterator,Iterable
print(isinstance(a,Iterator))  #True 表明a是迭代器
print(isinstance(a,Iterable))  #True 表明a是迭代对象


